package com.xianyu.us.service.impl;

import java.util.Map;
import java.util.Random;
import java.util.UUID;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.xianyu.us.common.annotatian.ExtCacheable;
import com.xianyu.us.common.exception.ServiceException;
import com.xianyu.us.common.utils.RandomNumberUtils;
import com.xianyu.us.common.utils.RedisUtils;
import com.xianyu.us.common.utils.SendMsgUtils;
import com.xianyu.us.dao.UsUserDao;
import com.xianyu.us.pojo.entity.UsUser;
import com.xianyu.us.service.UsUserService;

/**
 * 操作用户信息业务类
 * @author wangshili
 *
 */
@Service
public class UsUserSerciveImpl implements UsUserService {

	@Autowired
	private UsUserDao usUserDao;
	/**
	 * 获取操作邮箱的接口
	 */
	@Autowired
	private JavaMailSender mailSender;
	/**
	 * 获取操作reids的工具类
	 */
	@Autowired
	private RedisUtils redisUtils;

	@Override
	public int insertUser(UsUser user, String code) {
		/**
		 * 数据校验
		 */	
		if(StringUtils.isEmpty(user))
			throw new ServiceException("对象不能为空");
		if(StringUtils.isEmpty(user.getUsername()))
			throw new ServiceException("用户名不能为空");
		if(StringUtils.isEmpty(user.getPassword()))
			throw new ServiceException("密码不能为空");
		if(StringUtils.isEmpty(user.getEmail()) && StringUtils.isEmpty(user.getPhone())) //必须有一个验证
			throw new ServiceException("手机或者邮箱不能为空");
		if(usUserDao.selectUsUserByUsername(user.getUsername())>0)
			throw new ServiceException("用户名已存在，请更换");
		/**
		 * 从缓存中查看是否存在验证码
		 */

		Map<Object, Object> hmget = redisUtils.hmget("VerificationCode");
		/**
		 * 如果两个都不相等就报错
		 */
		boolean flag=false;
		if(hmget.size()>0) { //如果map长度大于0，说明有数据
			Object mailCode = hmget.get("["+user.getEmail()+"]");
			Object phoneCode = hmget.get("["+user.getPhone()+"]");

			if(mailCode!=null) { //判断是否为空
				if(mailCode.equals(code)) { //如果验证码一致就置真
					flag=true;
				}
			}else if(phoneCode!=null){ //这里判断是为了防止发送验证码是一个手机号，提交时却是其他数字导致空指针异常
				if(phoneCode.equals(code)) {
					flag=true;
				}
			}
		}
		//如果是false，说明校验不通过
		if(!flag)
			throw new ServiceException("验证码错误或已过期，请重新发送");
		/**
		 * 加密
		 */
		//1.获取盐值
		String salt = UUID.randomUUID().toString();
		//2.根据盐值生成加密后的密码
		String hashPassword = new SimpleHash(//Shiro框架
				"MD5",//algorithmName 算法
				user.getPassword(),//原密码
				salt, //盐值
				1).toHex();//hashIterations表示加密次数
		//更换密码为加密后的密码
		user.setPassword(hashPassword);
		//设置盐值
		user.setSalt(salt);
		/**
		 * 插入数据
		 */
		int rows = usUserDao.insertUser(user);
		if(rows<1)
			throw new ServiceException("用户创建失败，请重新尝试");
		return rows;
	}


	/**
	 * 获取短信验证码
	 */
	@ExtCacheable(value = "VerificationCode",expireTime = 60*5)//5分钟有效期
	public String getPhoneCode(String phone) {
		//return RandomNumberUtils.getString(6);
		return SendMsgUtils.sendPhone(phone);
	}

	/**
	 * 获取邮箱验证码
	 * 遇到的Bug:包没下载完全，导致一直空指针，重新更新了下就行了
	 * @param mail 邮件名
	 * @return
	 */
	@ExtCacheable(value = "VerificationCode",expireTime = 60*5)//5分钟有效期
	public String getMailCode(String mail) {//toSend需要发送的邮箱
		return SendMsgUtils.sendMail(mailSender,mail);//返回验证码，用于存储在缓存中
	}
	
	@Override
	public UsUser findByUsername(String username) {
		return usUserDao.selectByUsername(username);
	}
}
